共计 1061 个字符,预计需要花费 3 分钟才能阅读完成。
/*** 标题:最大矩阵和 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限* 给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大,我们把这个子矩阵称为和最大子矩阵,子矩阵的选取原则是原矩阵中一块相互连续的矩形区域。* 输入的第一行包含2个整数n, m(1 <= n, m <= 10),表示一个n行m列的矩阵,下面有n行,每行有m个整数,同一行中,每2个数字之间有1个空格,最后一个数字后面没有空格,所有的数字的在[-1000, 1000]之间。* 输出描述:* 输出一行一个数字,表示选出的和最大子矩阵内所有的数字和。* 示例1* 输入* 3 4* -3 5 -1 5* 2 4 -2 4* -1 3 -1 3* 输出* 20* 说明* 一个3*4的矩阵中,后面3列的子矩阵求和加起来等于20,和最大。*/public class M_N_T_32 {//这一题的思路是:由一维的连续子数组最大和,然后扩展到上下界的遍历,则可计算二维问题。//复杂度O(N^3)public static void main(String[] args) {Scanner sc = new Scanner(System.in);int rows = sc.nextInt();//行数int cols = sc.nextInt();//列数int res = Integer.MIN_VALUE;int[][] matrix = new int[rows][cols];for (int i = 0; i <= rows - 1; ++i) {for (int j = 0; j <= cols - 1; ++j) {matrix[i][j] = sc.nextInt();}}for (int begin = 0; begin <= rows - 1; ++begin) {//上边界int[] line = new int[cols];//每一列之和 //修改上边界之后,要清空重新开始for (int end = begin; end <= rows - 1; ++end) {//下边界//计算列元素和for (int j = 0; j <= cols - 1; ++j) {line[j] += matrix[end][j];//下边界每向下一行,就计算更新下line[]数组的值}res = Math.max(res, line[0]);int sum = 0;for (int j = 0; j <= cols - 1; ++j) {sum += line[j];res = Math.max(res, sum);//取最大if (sum < 0) sum = 0;//小于零,置零 //这样意味着最终的值可能是负数}}}System.out.println(res);}}
正文完

